package com.itheima.service.impl;

import cn.itheima.health.service.SetMealService;
import com.itheima.constant.RedisConstant;
import com.itheima.mapper.CheckGroupMapper;
import com.itheima.mapper.CheckItemMapper;
import com.itheima.mapper.SetMealMapper;
import com.itheima.pojo.CheckGroup;
import com.itheima.pojo.CheckItem;
import com.itheima.pojo.Setmeal;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.List;

@Service  // 添加@Service 注解  表示 这是一个 service层
@Transactional //后期如果 有事务 我们就添加事务注解
public class SetMealServiceImpl implements SetMealService {

    @Autowired
    private JedisPool jedisPool;
    @Autowired
    private CheckGroupMapper checkGroupMapper;
    @Autowired
    private CheckItemMapper checkItemMapper;


    @Autowired
    private SetMealMapper setMealMapper;

    @Override
    public void add(Setmeal setmeal, int[] checkgroupIds) {

        //   新建 checkGroupMapper 并且添加一个方法 传入的 CheckGroup检查组
        setMealMapper.add(setmeal);//  xml  sql     主键封装到当前实体类中
        //使用传入的 CheckGroup 检查组作为参数.getId 获得当前记录的主键
        Integer sid = setmeal.getId();
        //这里设置一个判断，判断用户传入的中间表信息，避免空指针
        //   2.  添加中间表信息
        if (checkgroupIds != null && checkgroupIds.length != 0) {
            //for 循环 遍历 用户添   封装好的 checkgroupIds 数据 然后遍历出来  封装到 setMealMapper 对应的 setMealAndGroup 方法中去
            for (int checkitemid : checkgroupIds) {
                //  在checkGroupMapper中创建一个方法 用于： 一边循环，一边将groupId 和 checkitemid 用户勾选的参数 等数据添加到 checkGroupMapper 中
                setMealMapper.setMealAndGroup(sid, checkitemid);
            }
        }

        /*       --------------- 2.  需要在Impl消费者中方法执行完毕前   这里插入   任务调度  每隔一段时间该方法执行一次            ---------------       */

        if (setmeal.getImg() != null) {
            Jedis resource = jedisPool.getResource();
            resource.sadd(RedisConstant.SETMEAL_PIC_DB_RESOURCES, setmeal.getImg());
            resource.close();
        }
        /*       ---------------      这里插入   任务调度  每隔一段时间该方法执行一次            ---------------       */
    }

    @Override
    public List<Setmeal> findAll() {
        return setMealMapper.findAll();
    }

    @Override
    public Setmeal findSetmealDetailById(Integer id) {
        //这里 就是要设计到Mapper 语句 所以这里关联的 就是  要明确需要 得到那些数据
        //我们这里就是需要查询sql 语句 通过 当前 setmeal套餐  的id 找到数据库中对应的数据
        Setmeal setmeal = setMealMapper.findSetmealDetailById(id);
        //因为 这里要查询 检查组的 信息， 所以 我们需要在最上面 添加   private CheckGroupMapper checkGroupMapper; 以及 @Autowired属性
        //并且添加一个 根据id 查询检查组的方法  便于后面编写Sql 语句
        //  (setmeal.getId())   -->  通过套餐的id 找到对应的检查组 id信息
        List<CheckGroup> checkGroupList = checkGroupMapper.findCheckGroupsBySetmealId(setmeal.getId());
        for (CheckGroup group : checkGroupList) {
            //通过检查组id 找到检查项
            List<CheckItem> checkItemList = checkItemMapper.findCheckItemsByGroupId(group.getId());
            group.setCheckItems(checkItemList); //注入 检查项
        }
        setmeal.setCheckGroups(checkGroupList);  //注入 检查组
        return setmeal;
    }
}
